// 导入Redux Toolkit的核心功能
import { createSlice } from '@reduxjs/toolkit';

/**
 * 搜索状态接口定义
 * 
 * 用于描述搜索相关状态的结构
 */
export interface SearchState {
	history: string[]; // 搜索历史记录数组
}

/**
 * 初始状态定义
 * 
 * 设置搜索相关状态的初始值
 */
const initialState: SearchState = {
	history: [], // 空数组：搜索历史记录
};

/**
 * 去重并添加搜索词到历史记录
 * 
 * 功能：将新的搜索词添加到历史记录的开头，并去重
 * 
 * 处理逻辑：
 * 1. 去除搜索词首尾空格
 * 2. 如果搜索词为空，直接返回原数组
 * 3. 过滤掉重复的搜索词
 * 4. 将新搜索词添加到数组开头
 * 5. 限制历史记录最多保存20条
 * 
 * @param {string[]} arr - 当前历史记录数组
 * @param {string} term - 新的搜索词
 * @returns {string[]} 返回更新后的历史记录数组
 */
const dedupePush = (arr: string[], term: string) => {
	const trimmed = term.trim(); // 去除首尾空格
	if (!trimmed) return arr; // 如果搜索词为空，直接返回
	
	const next = arr.filter((t) => t !== trimmed); // 过滤掉重复的搜索词
	next.unshift(trimmed); // 将新搜索词添加到数组开头
	return next.slice(0, 20); // 最多保存20条历史记录
};

/**
 * 搜索Slice配置
 * 
 * 管理搜索相关的状态和操作
 */
const searchSlice = createSlice({
	name: 'search', // slice名称
	initialState, // 初始状态
	reducers: {
		/**
		 * 添加搜索历史
		 * 
		 * 功能：将新的搜索词添加到历史记录中
		 * 
		 * @param {SearchState} state - 当前状态
		 * @param {Object} action - action对象
		 * @param {string} action.payload - 新的搜索词
		 */
		addHistory: (state, action: { payload: string }) => {
			state.history = dedupePush(state.history, action.payload);
		},
		
		/**
		 * 移除搜索历史
		 * 
		 * 功能：从历史记录中移除指定的搜索词
		 * 
		 * @param {SearchState} state - 当前状态
		 * @param {Object} action - action对象
		 * @param {string} action.payload - 要移除的搜索词
		 */
		removeHistory: (state, action: { payload: string }) => {
			state.history = state.history.filter((t) => t !== action.payload);
		},
		
		/**
		 * 清空搜索历史
		 * 
		 * 功能：清空所有搜索历史记录
		 * 
		 * @param {SearchState} state - 当前状态
		 */
		clearHistory: (state) => {
			state.history = [];
		},
	},
});

/**
 * 导出actions
 * 
 * 供组件使用的action creators
 */
export const { 
	addHistory, // 添加搜索历史
	removeHistory, // 移除搜索历史
	clearHistory // 清空搜索历史
} = searchSlice.actions;

/**
 * 导出reducer
 * 
 * 供store配置使用的reducer函数
 */
export default searchSlice.reducer;